package com.qujia.common.core.domain.entity;

import java.util.Date;
import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qujia.common.annotation.Excel;
import com.qujia.common.annotation.Excel.ColumnType;
import com.qujia.common.annotation.Excel.Type;
import com.qujia.common.annotation.Excels;
import com.qujia.common.core.domain.BaseEntity;

/**
 * 用户对象 sys_user
 *
 * @author qujia
 */

@Data
public class SysUser extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @ApiModelProperty("用户序号")
    @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
    private Long userId;

    private Long supremeLevelId;


    private String supremeLevelName;


    private List<Long> userIdList;

    private List<String> createByList;

    @TableField(exist = false)
    private List<Long> enterpriseIdListForAuthor;

    @TableField(exist = false)
    private String enterpriseName;


    /**
     * 部门ID
     */
    @ApiModelProperty("部门编号")
    @Excel(name = "部门编号", type = Type.IMPORT)
    private Long deptId;

    /**
     * 角色ID
     */
    @ApiModelProperty("分配角色")
    private String roleId;

    /**
     * 权限等级 1=（业务经理&仓储）2=（油企）3=（油站&员工）
     */
    @ApiModelProperty("权限等级 1=（业务经理&仓储）2=（油企）3=（油站&员工）")
    private String authLevel;


    /**
     * 归属一级账号
     */
    @ApiModelProperty("归属一级账号")
    private Long authorId;


    /**
     * 油企id
     */
    @ApiModelProperty("油企id")
    @Excel(name = "油企id", type = Type.IMPORT)
    private Long enterpriseId;


    /**
     * 用户账号
     */
    @ApiModelProperty("登录名称")
    @Excel(name = "登录名称")
    private String userName;

    /**
     * 用户昵称
     */
    @ApiModelProperty("用户名称")
    @Excel(name = "用户名称")
    private String nickName;


    /**
     * 合伙人联系人名称
     */
    @ApiModelProperty("合伙人联系人名称")
    @Excel(name = "合伙人联系人名称")
    private String partnerName;

    /**
     * 用户邮箱
     */
    @ApiModelProperty("用户邮箱")
    @Excel(name = "用户邮箱")
    private String email;

    /**
     * 手机号码
     */
    @ApiModelProperty("手机号码")
    @Excel(name = "手机号码")
    private String phonenumber;

    /**
     * 用户性别
     */
    @ApiModelProperty("用户性别")
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    private String sex;

    /**
     * 用户头像
     */
    @ApiModelProperty("用户头像")
    private String avatar;

    /**
     * 密码
     */
    @ApiModelProperty("密码")
    private String password;

    /**
     * 盐加密
     */
    @ApiModelProperty("盐加密")
    private String salt;

    /**
     * 帐号状态（0正常 1停用）
     */
    @ApiModelProperty("帐号状态")
    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
    private String status;

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    private String delFlag;

    /**
     * 最后登录IP
     */
    @Excel(name = "最后登录IP", type = Type.EXPORT)
    private String loginIp;

    /**
     * 最后登录时间
     */
    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
    private Date loginDate;

    /**
     * 部门对象
     */
    @Excels({
            @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
            @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
    })
    private SysDept dept;

    /**
     * 油企id
     */
    @Excel(name = "所属油企id", type = Type.EXPORT)
    private SysEnterprise enterprise;

    @Excel(name = "等级", type = Type.EXPORT)
    private String userLevel;


    @TableField(exist = false)
    private String notUserLevel;
    /**
     * 部门ID
     */
    @Excel(name = "油站id", type = Type.IMPORT)
    private Long stationId;

    /**
     * 油企id
     */
    @Excel(name = "所属油站id", type = Type.EXPORT)
    private SysStation stationInfo;


    @Excel(name = "油站信息", type = Type.EXPORT)
    private String stationName;

    /**
     * 角色对象
     */
    private List<SysRole> roles;


    /**
     * 角色分配对象
     */
    private List<SysRole> roleList;

    /**
     * 角色组
     */
    private Long[] roleIds;

    /**
     * 岗位组
     */
    private Long[] postIds;


    /**
     * 抢号
     */
    @Excel(name = "抢号", type = Type.EXPORT)
    private String gun;

    /**
     * 下属油企数量
     */
    @Excel(name = "下属油企数量", type = Type.EXPORT)
    private Integer subNum;

    /**
     * 抢号集合
     */
    @Excel(name = "抢号集合", type = Type.EXPORT)
    private List<String> gunList;



    /**
     * 推送通知给加油员的开关1开启
     */
    @Excel(name = "推送通知给加油员的开关1开启", type = Type.EXPORT)
    private String empPushFlag;

    /**
     * 发送空订单0不发送1发送
     */
    @Excel(name = "发送空订单0不发送1发送", type = Type.EXPORT)
    private String nullSendFlag;

    /**
     * 发送的加油员id
     */
    @Excel(name = "发送的加油员id", type = Type.EXPORT)
    private String pushUserIds;

    /**
     * 接收通知的openId
     */
    @Excel(name = "接收通知的openId", type = Type.EXPORT)
    private String pushOpenid;

    /**
     * 用户id的集合
     */
    private List<String> idList;

    //todo 这个字段只在添加用户的时候做了插入，如果哪里要用到，哪条sql就要加上这个查询结果 利总说哪里做到就哪里改
    @ApiModelProperty("是否员工 0 油站 1 员工")
    @Setter
    @Getter
    private String employeeOrNot;

    @ApiModelProperty("员工账号首页数据按当日全部或根据班结时间展示 1：按照班结时间，0：按照全日")
    private String employeeShow;

    @ApiModelProperty("新密码")
    private String newPassword;

    @ApiModelProperty("确认密码")
    private String confirmPassword;

    /** 员工微信公众号推荐二维码路径 */
    @Excel(name = "员工微信公众号推荐二维码路径")
    private String inviteQrcodeUrl;

    public List<String> getIdList() {
        return idList;
    }

    public void setIdList(List<String> idList) {
        this.idList = idList;
    }

    public String getEmpPushFlag() {
        return empPushFlag;
    }

    public void setEmpPushFlag(String empPushFlag) {
        this.empPushFlag = empPushFlag;
    }

    public String getNullSendFlag() {
        return nullSendFlag;
    }

    public void setNullSendFlag(String nullSendFlag) {
        this.nullSendFlag = nullSendFlag;
    }

    public String getPushUserIds() {
        return pushUserIds;
    }

    public void setPushUserIds(String pushUserIds) {
        this.pushUserIds = pushUserIds;
    }

    public String getPushOpenid() {
        return pushOpenid;
    }

    public void setPushOpenid(String pushOpenid) {
        this.pushOpenid = pushOpenid;
    }

    public SysUser() {

    }

    private String agentFlag;

    public String getGun() {
        return gun;
    }

    public void setGun(String gun) {
        this.gun = gun;
    }

    public List<String> getGunList() {
        return gunList;
    }

    public void setGunList(List<String> gunList) {
        this.gunList = gunList;
    }

    public String getUserLevel() {
        return userLevel;
    }

    public void setUserLevel(String userLevel) {
        this.userLevel = userLevel;
    }

    public Long getStationId() {
        return stationId;
    }

    public void setStationId(Long stationId) {
        this.stationId = stationId;
    }

    public SysStation getStationInfo() {
        return stationInfo;
    }

    public void setStationInfo(SysStation stationInfo) {
        this.stationInfo = stationInfo;
    }

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public Long getEnterpriseId() {
        return enterpriseId;
    }

    public void setEnterpriseId(Long enterpriseId) {
        this.enterpriseId = enterpriseId;
    }

    public SysEnterprise getEnterprise() {
        return enterprise;
    }

    public void setEnterprise(SysEnterprise enterprise) {
        this.enterprise = enterprise;
    }

    public String getAgentFlag() {
        return agentFlag;
    }

    public void setAgentFlag(String agentFlag) {
        this.agentFlag = agentFlag;
    }

    public SysUser(Long userId) {
        this.userId = userId;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public boolean isAdmin() {
        return isAdmin(this.userId);
    }

    public static boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }

    public Long getDeptId() {
        return deptId;
    }

    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }

    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    @NotBlank(message = "用户账号不能为空")
    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    @JsonIgnore
    @JsonProperty
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(String delFlag) {
        this.delFlag = delFlag;
    }

    public String getLoginIp() {
        return loginIp;
    }

    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }

    public Date getLoginDate() {
        return loginDate;
    }

    public void setLoginDate(Date loginDate) {
        this.loginDate = loginDate;
    }

    public SysDept getDept() {
        return dept;
    }

    public void setDept(SysDept dept) {
        this.dept = dept;
    }

    public List<SysRole> getRoles() {
        return roles;
    }

    public void setRoles(List<SysRole> roles) {
        this.roles = roles;
    }

    public Long[] getRoleIds() {
        return roleIds;
    }

    public void setRoleIds(Long[] roleIds) {
        this.roleIds = roleIds;
    }

    public Long[] getPostIds() {
        return postIds;
    }

    public void setPostIds(Long[] postIds) {
        this.postIds = postIds;
    }

    public String getEmployeeShow() {
        return employeeShow;
    }

    public void setEmployeeShow(String employeeShow) {
        this.employeeShow = employeeShow;
    }

    public String getNewPassword() {
        return newPassword;
    }

    public void setNewPassword(String newPassword) {
        this.newPassword = newPassword;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        this.confirmPassword = confirmPassword;
    }

    public String getInviteQrcodeUrl() {
        return inviteQrcodeUrl;
    }

    public void setInviteQrcodeUrl(String inviteQrcodeUrl) {
        this.inviteQrcodeUrl = inviteQrcodeUrl;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("userId", getUserId())
                .append("deptId", getDeptId())
                .append("userName", getUserName())
                .append("nickName", getNickName())
                .append("email", getEmail())
                .append("phonenumber", getPhonenumber())
                .append("sex", getSex())
                .append("avatar", getAvatar())
                .append("password", getPassword())
                .append("salt", getSalt())
                .append("status", getStatus())
                .append("delFlag", getDelFlag())
                .append("loginIp", getLoginIp())
                .append("loginDate", getLoginDate())
                .append("createBy", getCreateBy())
                .append("createTime", getCreateTime())
                .append("updateBy", getUpdateBy())
                .append("updateTime", getUpdateTime())
                .append("remark", getRemark())
                .append("dept", getDept())
                .append("agentFlag", getAgentFlag())
                .toString();
    }
}
